/**
 * Clase que procesa una pagina HTML.
 * 
 * @author HPCIII_Team2013
 */

package cl.ucn.hpc.procesamiento;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HTMLProcessing implements Serializable {
        //Creado automaticamente por java para clases serializables
        private static final long serialVersionUID = 2222491060054527907L;

        /**
         * Contructor vacio de la clase
         */
        public HTMLProcessing() {

        }

        /**
         * Elimina las anotaciones HTML de la pagina recibida.
         * 
         * @param f Archivo con la pagina recibida.
         * @return Texto de la pagina sin anotaciones HTML.
         * @throws IOException Si ocurre un error con InputStream.
         */
        public static String extractText(File f) throws IOException {
	        FileInputStream stream = new FileInputStream(f);
	        try {
	            Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
	            StringBuilder builder = new StringBuilder();
	            char[] buffer = new char[8192];
	            int read;
	            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
	                    builder.append(buffer, 0, read);
	            }
	
	            return extractText(builder.toString());
	
	        } finally {	
                stream.close();
	        }

        }

        /**
         * Extrae las anotaciones HTML del texto recibido.
         * 
         * @param f Texto que contiene anotaciones HTML.
         * @return Texto sin anotaciones HTML.
         */
        public static String extractText(final String f) {
            if (f == null || f.isEmpty()) {
                    return null;
            }
            String results = Jsoup.parse(f).text();

            return results;
        }

        /**
         * Extrae los links de la pagina recibida.
         * 
         * @param f Archivo con la pagina recibida.
         * @return Listado con los links de las paginas encontradas.
         * @throws IOException Si no puede crear el FileInputStream.
         */
        public static List<String> extractLinks(final File f) throws IOException {
	        FileInputStream stream = new FileInputStream(f);
	        try {
                Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
                StringBuilder builder = new StringBuilder();
                char[] buffer = new char[8192];
                int read;
                while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                        builder.append(buffer, 0, read);
                }

                return extractLinks(builder.toString());
	
	        } finally {
                stream.close();
	        }
        }

        /**
         * Extrae los links del texto recibido.
         * 
         * @param f Texto que puede contener links.
         * @return Lista con los links de las paginas encontradas.
         */
        public static List<String> extractLinks(final String f){
            if (f == null || f.isEmpty()) {
                return null;
            }

            Document doc = Jsoup.parse(f);

            Elements links = doc.select("a[href]");

            List<String> urls = new ArrayList<String>();

            for (Element link : links) {
                String l = link.attr("abs:href");
                if (l != null & !l.isEmpty()) {
                        urls.add(l);
                }
            }

            return urls;
        }

        /**
         * Extrae los links de las imagenes contenidas en la pagina recibida.
         * 
         * @param f Archivo que contiene la pagina recibida.
         * @return Lista con los links de las imagenes encontradas.
         * @throws IOException Si no puede crear el InputStream.
         */
        public static List<String> extractImageUrl(final File f) throws IOException {
            FileInputStream stream = new FileInputStream(f);
            try {
                Reader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF8")));
                StringBuilder builder = new StringBuilder();
                char[] buffer = new char[8192];
                int read;
                while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                        builder.append(buffer, 0, read);
                }

                return extractImageUrl(builder.toString());

            } finally {
                stream.close();
            }
        }

        /**
         * Extrae los links de las imagenes contenidas en el texto recibido.
         * 
         * @param f Texto que puede contener vinculos de imagenes.
         * @return Lista con los links de las imagenes encontradas.
         */
        public static List<String> extractImageUrl(final String f) {
            if (f == null || f.isEmpty()) {
                return null;
            }
            Document doc = Jsoup.parse(f);

            Elements media = doc.select("[src]");

            List<String> urls = new ArrayList<String>();

            for (Element link : media) {
                String l = link.attr("abs:src");
                if (l != null & !l.isEmpty()) {
                    urls.add(l);
                }
            }

            return urls;
        }
}